package designPattern.Singleton;

/**
 * @author jiangwz
 * @create 2022/3/16.
 */
public class DCLTest {

    private volatile static Integer singleton;
    private DCLTest (){}
    public static Integer getSingleton() {
        if (singleton == null) { // 保证new了之后的得到实例的效率
            synchronized (DCLTest.class) {
                if (singleton == null) { //保证new的时候实例还没有被创建,否则别的线程会new很多实例
                    singleton = new Integer(1);

                    /**
                     * memory = allocate(); // 1.分配对象内存空间
                     * instance(memory)     // 2.初始化对象  把内存中的值初始化为1
                     * instance = memory    // 3. 设置实例指向刚分配的内存地址,此时instance != null   把指针指向内存
                     *
                     * 可能会出现指令重排
                     * 1-2-3
                     * 1-3-2
                     * 我的理解 先分配内存,再初始化对象,把对象指向分配的内存地址
                     *
                     * 1-3-2的解释: 1,3先执行了 此时singleton = 0, 因为2还未执行, 这时其他线程就拿到错误的数据
                     */
                }
            }
        }
        return singleton;
    }
}
